package Day07;
//面向对象
public class Day07 {
    public static void main(String[] args) {
        /* 面向对象的三个特性
        * 1封装
        * 2继承
        * 3多态
        * (想多态 先继承)*/
        /*面向过程(方法 函数)
        定义 以<方法>为单位来解决问题的编程方法
        只适合于简单的业务 例如 把大象装进冰箱分几步--三步 三个方法
                            去银行取钱的步骤--带着卡 排队 取钱 离开
        * 面向对象
        定义 以<对象>为单位来解决问题的编程方式
        对象 凡是真实存在的独立的个体 就是对象
        适合复杂的业务 例如 造车,需要轮胎,车窗,车壳,方向盘等等
                         造个航母...
        简单的业务不适合面向对象方式 例如 把大象装进冰箱分几步--需要有三个对象(三个类) 人 大象 冰箱
                                    人开门 大象被装进冰箱等等 很麻烦
        */
        /*OO(Object-Oriented) 面向对象
        * OOA 面向对象分析
        * OOD 面向对象设计
        * OOP 面向对象的编程--------(重点)
        */
        /*高质量代码要素
        * 要求
        * 性能好 多数是基于网页的开发 对于效率的要求高
        * 可读性好 见文知意 清晰明了
        * 健壮性好 不能过多报错
        * 移植性好 把方法从a直接拿到b中
        * 维护性好 后续能维护
        * 扩展性好 在代码里加东西 功能扩展
        * 复用性好(重中之重 一切的前提) 重复代码尽量少
        */
        /*类和对象
        * 学员管理系统设计
        *   1 学生
        *   2 生活中通过表格管理相同结构数据----学生都有姓名 年龄 班级名称 学号等等
        * 类 变量和方法组成的一种新的数据类型---引用类型
        * 类中可以包含 1 对象的属性/特征/数据,设计为成员变量
        *            2 对象的行为/功能,设计为方法
        * 当java给予的数据类型不能满足需求时 可以自己造
        * 语法   class 类名{-------自己创造的数据类型(引用类型)
        * 成员变量类型 变量名;
        * 方法();-----------------public static不要了 直接从void写起
        * }*/
        /*表格中每行数据称为记录 每条记录都是一个对象
        * 创建对象的过程成为实例化
        * 语法:new 类名();  但是一般不这么用
        * */
        /*引用类型变量
        * 为了能够对实例化的对象进行访问控制 需要使用特殊的变量
        * Student         stu          =    new Student();
        * 数据类型  引用类型变量(简称引用)  指向       对象
        * 声明了Student类型的引用stu 指向了一个学生对象*/

        //在类中创建引用类型变量 创建方法 不需要在main中
        //在另一个类中用main创建对象 访问成员变量和调用方法

//访问对象的成员变量,调用方法
        //通过引用名打点的方式来访问对象的成员变量或调用方法
        //例如Student zg=new Student();
        //zg.name="张光";------ zg 的(.) 名字(name) 是(=) 张光
        //zg.age=20;...



        //this关键字
        //this.成员变量名----------------访问成员变量
        //this.方法名()-----------------调用方法(很少用)方法名和参数不可能都相同
        //this()-----------------------调用构造方法(很少用 以Student构造方法为例)
//        Student(){
//            this("1",1,"1","1");-----调用4个参数的构造方法
//        }
        //作用 只能用在方法里面 外面不行 方法中访问成员变量之前 默认都有<this.>
        //写在方法外面的变量叫做成员变量 在方法里写的是局部变量

        //this.
        // 命名一般为纯英文 数字 _ $只在特殊环境下使用
        //方法外的是成员变量 方法内的是局部变量 两者是可以重名的 但是适用范围不一样
        //成员变量在整个类都能用-----局部变量只能在当前方法内使用
        //使用时默认(不加以区分)采取就近原则
        //若在参数中有name 在方法外也有一个name 此时在方法内写name 默认为局部变量(参数内变量离方法近)
        //若要表明方法内的name为成员变量 需在之前加this. 此this.不能省略
        //应该写成this.name=name
        //而在方法外 即使重名 this.也可以省略 因为局部变量只在方法内起作用 方法外的必定是成员变量
        //(想访问成员 必须加this)

        //例如
        //public class Student {
        //String name;
//        void playWith(String name){
//            System.out.println(this.name+"正在和"+name+"一起玩");
//        }
//      }
        //其中this.name是成员变量 name是局部变量 若this去掉 则就近原则 方法内默认为局部变量

        //this指代的是当前对象 哪个对象调用方法 this指的就是哪个对象
        //例如
        /*Student zg = new Student();
        zg.name="张光";
        zg.study();
        -------------------------------------------------------------------------------------------------
        String name;
        void study(){
                                 zg.name
            System.out.println(this.name+"正在学习...");*/
        //此处的this指的是zg zg调用了study()方法 所以this.name => zg.name

        //构造方法 构造函数 构造器 构建器
        //只有给成员变量赋默认值才用构造
        //要求 1 构造方法与类同名
        //    2 没有返回值类型(连void都没有)
        //例如
        //class Student{
        //String name;
        //int age;
        //Student(String name1,int age1){-----构造方法(有参数)---Student a=new Student();(创建对象时自动使用无参数的构造)
        //this.name=name1;
        //this.age=age1;
        // }
        //void study(){
        //System.out.println(this.name+"在学习");
        // }
        // }
        //规则 在创建(new)对象时被自动使用 只要new 就一定会自动调用构造方法
            //若自己不写构造方法 则编译器默认提供一个无参数构造方法
            //若自己写了构造方法 则不再默认提供 此时再new一个无参构造会报错

        //构造方法可以重载 可以又有参又无参
        //数是写死的 可以无参 若不是 则需要参数




        //补充
        //内存管理
        //java的内存都是由JVM来管理的------做了解即可
        //包含软件 硬件
        /**
         * 内存管理包括(JVM自动分配 无法更改存放位置)
         * 堆 所有new出来的对象(包括实例变量<成员变量> 数组的元素 方法的地址)
         * 栈 局部变量(包括方法的参数)
         * 方法区 .class字节码文件(包括静态的变量<static修饰的即为静态变量> 所有方法)
         *
         * 1 用到哪个类 就会将那个类的.class加载到方法区
         * 2 调用方法时 方法就会入栈 方法执行完之后 方法出栈
         * 3 new出来的对象存储在堆中 引用里面装的是对象的地址
         */

    }
}
